﻿using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;

namespace daBase.Analyser
{
    // Объекты
    using Objects.AnalysisErrors;
    using Objects.Metrics;
    using Objects.Safe;

    /// <summary>
    /// Базовый анализатор
    /// </summary>
    public abstract class BaseAnalyser : Attribute
    {
        /// <summary>
        /// Событие "произошла ошибка"
        /// </summary>
        [Browsable(false)]
        public event EventHandler<ErrorArgs> ErrorOccuredEvent;

        /// <summary>
        /// Чистое оздание ошибки
        /// </summary>
        /// <param name="Message">сообщение об ошибке</param>
        /// <param name="Level">уровень важности ошибки</param>
        /// <param name="File">информация о файле, содержащем ошибку</param>
        /// <param name="Line">номер строки, содержащей ошибку</param>
        /// <param name="Code">участок кода, содержащий ошибку</param>
        /// <param name="MetaTags">мета данные</param>
        /// <param name="Hint">подсказка по устранению ошибки</param>
        /// <returns>созданная ошибка</returns>
        protected virtual ParsingError RawError(string Message, int Level, string File, int Line, string Code, SafeDictionary<string, string> MetaTags, string Hint)
        {
            return new ParsingError(Message, Level, File, Line, Code, MetaTags, Hint);
        }

        /// <summary>
        /// Добавление ошибки
        /// </summary>
        /// <param name="Message">сообщение об ошибке</param>
        /// <param name="Level">уровень важности ошибки</param>
        /// <param name="File">информация о файле, содержащем ошибку</param>
        /// <param name="Line">номер строки, содержащей ошибку</param>
        /// <param name="MetaTags">мета данные</param>
        /// <param name="Hint">подсказка по устранению ошибки</param>
        protected void AddError(string Message, int Level, string File, int Line, string Code, SafeDictionary<string, string> MetaTags, string Hint)
        {
            if (ErrorOccuredEvent != null)
                ErrorOccuredEvent(this, new ErrorArgs(RawError(Message, Level, File, Line, Code, MetaTags, Hint)));
        }

        /// <summary>
        /// Событие "Вычислена метрика"
        /// </summary>
        public event EventHandler<MetricaArgs> MetricaCalculatedEvent;

        /// <summary>
        /// Добавление метрики
        /// </summary>
        /// <param name="name">Название метрики</param>
        /// <param name="val">Значенин метрики</param>
        protected virtual void AddMetric(string name, float val, string obj, string file, int line)
        {
            if (MetricaCalculatedEvent != null)
                MetricaCalculatedEvent(this, new MetricaArgs(new Metrica(name, val, obj, file, line)));
        }
    }
}
